package com.gitee.feizns.dynamic.function;

import java.util.function.BiConsumer;
import java.util.function.BiFunction;

/**
 * 子函数
 * @author feizns
 * @since 2023/05/02
 */
public class ChildrenBiFunction<T, U> extends ChildrenFunction<T> {

    /**
     * 第二个函数参数
     */
    private final U second;

    /**
     * 第二个函数参数
     * @return {@link U}
     */
    public U getSecond() {
        return second;
    }

    public ChildrenBiFunction(T parameter, U second) {
        super(parameter);
        this.second = second;
    }

    /**
     * 应用参数与某个{@link BiFunction}函数
     * @param func 函数
     * @return {@link R}
     */
    public <R> R apply(BiFunction<T, U, R> func) {
        return func.apply(getParameter(), second);
    }

    /**
     * 应用参数与某个{@link BiConsumer}函数
     * @param consumer 消费者
     */
    public void apply(BiConsumer<T, U> consumer) {
        consumer.accept(getParameter(), second);
    }

    /**
     * 将原参数进行映射
     * @param mapper 映射函数函数
     * @return {@link R}
     */
    public <R> ChildrenFunction<R> map(BiFunction<T, U, R> mapper) {
        return new ChildrenFunction<R>(apply(mapper));
    }

}
